/**
 * @file livre.h
 * @brief Fichier d'entête du module livre.
 *
 * @author Rachid Delory, Mamadou Keita, Florian Bernard
 */

#ifndef H_LIVRE_H
#define H_LIVRE_H

/* *********************************************************************

                       Librairies de livre                           

********************************************************************* */

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include "collection.h"
#include "typeedition.h"

/* *********************************************************************

                        Définitions de types                           

********************************************************************* */

/**
 * @enum ILLUSTRATION
 * @brief Enum utilisé pour dire si le livre possède une ou plusieurs illustrations
 *
 */
enum ILLUSTRATION
  {
    OUI_LIV = 1,
    NON_LIV = 0
  };

/**
 * @struct sLivre
 * @brief Structure utilisée pour la gestion des Livre
 *
 * Cette structure est utilisée pour gérer un Livre. Les champs de cette structure doivent être modifiés ou lus par les accesseurs et mutateurs. Ils doivent être initialisés et libérés avec les fonctions prévus à cette effet
 */
struct sLivre {
	int id; /** */
	int volume; /** */
	int numCollection; /** */
	int taille; /** */
	int nbPage; /** */
	char * isbn; /** */
	char * resume; /** */
	int illustration; /** */
	Collection * pCollection; /** */
	TypeEdition * pEdition; /** */
  char maj;
  char sup;
};
/**
 * @typedef Livre
 * @brief Redéfinit la structure sLivre
 */
typedef struct sLivre Livre;

/* *********************************************************************

           Fonction de la structure Livre               

********************************************************************* */

/**
 * @fn void init_Liv(Livre *ptr);
 * @brief initialise un livre dans la mémoire .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void init_Liv(Livre *ptr);

/**
 * @fn void liberer_Liv(Livre *ptr) ;
 * @brief libère un livre dans la mémoire .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void liberer_Liv(Livre *ptr);

/**
 * @fn Livre * creer_Liv(Livre *ptr, const int val) ;
 * @brief cree un livre dans la mémoire .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
Livre * creer_Liv();

/**
 * @fn void detruire_Liv(Livre ** livre)
 * @brief detruit un livre dans la mémoire .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void detruire_Liv(Livre **livre);

/**
 * @fn void copier_Liv(Livre ** dest, const Livre *src)
 * @brief copier le livre src dans le livre dest
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param src.
 */
void copier_Liv(Livre **dest, const Livre *src);

/* *********************************************************************

           Accesseurs et Mutateurs de la structure Livre               

********************************************************************* */

/**
 * @fn int getId_Liv(const Livre * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Livre
 * @return int
 */
int getId_Liv(const Livre * ptr) ;

/**
 * @fn void setId_Liv(Livre *ptr, const int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void setId_Liv(Livre *ptr, const int val) ;

/**
 * @fn int getVolume_Liv(const Livre * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Livre
 * @return int
 */
int getVolume_Liv(const Livre * ptr) ;

/**
 * @fn void setVolume_Liv(Livre *ptr, const int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void setVolume_Liv(Livre *ptr, const int val) ;

/**
 * @fn int getNumCollection_Liv(const Livre * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Livre
 * @return int
 */
int getNumCollection_Liv(const Livre * ptr) ;

/**
 * @fn void setNumCollection_Liv(Livre *ptr, const int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void setNumCollection_Liv(Livre *ptr, const int val) ;

/**
 * @fn int getTaille_Liv(const Livre * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Livre
 * @return int
 */
int getTaille_Liv(const Livre * ptr) ;

/**
 * @fn void setTaille_Liv(Livre *ptr, const int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void setTaille_Liv(Livre *ptr, const int val) ;

/**
 * @fn int getNbPage_Liv(const Livre * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Livre
 * @return int
 */
int getNbPage_Liv(const Livre * ptr) ;

/**
 * @fn void setNbPage_Liv(Livre *ptr, const int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void setNbPage_Liv(Livre *ptr, const int val) ;

/**
 * @fn char * getIsbn_Liv(const Livre * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Livre
 * @return char *
 */
char * getIsbn_Liv(const Livre * ptr) ;

/**
 * @fn void setIsbn_Liv(Livre *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void setIsbn_Liv(Livre *ptr, const char * val) ;

/**
 * @fn char * getResume_Liv(const Livre * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Livre
 * @return char *
 */
char * getResume_Liv(const Livre * ptr) ;

/**
 * @fn void setResume_Liv(Livre *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void setResume_Liv(Livre *ptr, const char * val) ;

/**
 * @fn int getIllustration_Liv(const Livre * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Livre
 * @return int
 */
int getIllustration_Liv(const Livre * ptr) ;

/**
 * @fn void setIllustration_Liv(Livre *ptr, const int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void setIllustration_Liv(Livre *ptr, const int val) ;

/**
 * @fn Collection * getPCollection_Liv(const Livre * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Livre
 * @return Collection *
 */
Collection * getPCollection_Liv(const Livre * ptr) ;

/**
 * @fn void setPCollection_Liv(Livre *ptr, const Collection * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void setPCollection_Liv(Livre *ptr, Collection * val) ;

/**
 * @fn TypeEdition * getPEdition_Liv(const Livre * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Livre
 * @return TypeEdition *
 */
TypeEdition * getPEdition_Liv(const Livre * ptr) ;

/**
 * @fn void setPEdition_Liv(Livre *ptr, const TypeEdition * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Livre.
 * @param val.
 */
void setPEdition_Liv(Livre *ptr, TypeEdition * val) ;

/**
 * @fn void setMaj_Liv(Livre *ptr, const char b);
 * @brief Set le besoin de faire une mise à jour, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setMaj_Liv(Livre *ptr, const char b);

/**
 * @fn char getMaj_Liv(const Livre *ptr);
 * @brief Retourne 0 si pas besoin de faire la mise à jour, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getMaj_Liv(const Livre *ptr);

/**
 * @fn void setSup_Liv(Livre *ptr, const char b);
 * @brief Set le besoin de le supprimer, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setSup_Liv(Livre *ptr, const char b);

/**
 * @fn char getSup_Liv(const Livre *ptr);
 * @brief Retourne 0 si pas besoin de le supprimer, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getSup_Liv(const Livre *ptr);

#endif
